// 将对象组合成树形结构，以表示“整体-部分”的层次结构。
// 通过对象的多态表现，使得用户对单个对象和组合对象的使用具有一致性。

// 技术要点:  每个对象都有相同的方法, 可以注册到处理类中, 然后统一处理

class TrainOrder{
    deal(){
        console.log("处理火车订单")
    }
}

class HotelOrder{
    deal(){
        console.log("处理旅馆订单")
    }
}



class TotalOrder{
    orderList:any[]
    constructor(){
        this.orderList = []
    }

    addOrder(order){
        this.orderList.push(order);
        return this
    }
    
    deal(){
        this.orderList.forEach( item=>{
            item.deal();
        })
    }
}

const hotelOrder = new HotelOrder();
const trainOrder = new TrainOrder();
const total = new TotalOrder();

total.addOrder(hotelOrder).addOrder(trainOrder).deal();


// 场景
// 表示对象-整体层次结构
// 希望用户忽略组合对象和单个对象的不同，用户将统一地使用组合结构中的所有对象（方法）

// 缺点
// 如果通过组合模式创建了太多的对象，那么这些对象可能会让系统负担不起。